package com.bjsxt.common.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

@Component("encryptutil")
public class EncryptUtil {
	@Resource
	private RegexUtil regexutil=new RegexUtil();
	//MD5加密
	public String md5(String s){
		char hexDigits[]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
		byte[] btInput=s.getBytes();
		//获得MD5摘要算法的MessgeDigest对象
		try {
			MessageDigest mdInst=MessageDigest.getInstance("MD5");
			//使用指定的字节更新摘要
			mdInst.update(btInput);
			//获得密文
			byte[] md=mdInst.digest();
			//把密文转换成十六进制的字符串形式
			int j=md.length;
			char str[]=new char[j*2];
			int k=0;
			for(int i=0;i<j;i++){
				byte byte0=md[i];
				str[k++]=hexDigits[byte0 >>> 4 & 0xf];
				str[k++] = hexDigits[byte0 & 0xf];
			}
			return new String(str);
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
	//密码字符串
	public String encryString(String password){
		/* 明文:
		 * 32位随机数$md5$整体加密后的字符串
		 * 
		 * MD5加密:(32位随机数$md5$11111))
		 * 
		 * 密文:32位随机数$md5$  MD5加密:(32位随机数$md5$11111))
		 *  */
		String randStr =this.regexutil.randString(32);
		System.out.println(randStr);
		//32位随机数$md5$1111
		String md5Str= randStr+"$MD5$";
		System.out.println(md5Str);
		//32位随机数$md5$ MD5加密：（32为随机数$md5$11111）
		randStr=this.md5(md5Str+password);
		return md5Str+randStr;
		
	}
	//检查两个字符串（密文是否相等）
	public boolean checkPassword(String password,String encStr){
		//官方字符串中必须有 $
		if(encStr.indexOf("$")==-1){
			return false;
		}
		
		/* 明文:
		 * 32位随机数$md5$整体加密后的字符串
		 * 
		 * MD5加密:(32位随机数$md5$11111))
		 * 
		 * 密文:32位随机数$md5$  MD5加密:(32位随机数$md5$11111))
		 *  */
		/* 处理密文字符串 */
		String[] encStrs=encStr.split("\\$");
		String md5Str=encStrs[0]+"$"+encStrs[1]+"$"+password;
		md5Str=encStrs[0]+"$"+encStrs[1]+"$"+this.md5(md5Str);
		return md5Str.equalsIgnoreCase(encStr);
	}

	public static void main(String[] args)
	{
		EncryptUtil encryptUtil = new EncryptUtil();
		System.out.println("---" + encryptUtil.md5("111111"));
		System.out.println(encryptUtil.encryString("111111"));
		String souStr = "dQ1HwMOCUS2k5NWZgJwDlV5rcszR9b2M$MD5$1A53F1ABD8431D9C655B353F348E6087" ; 
		String pass = "111111" ; 
		System.out.println(encryptUtil.checkPassword(pass, souStr));
	}
}
